home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / X11 / wais / waisgate / HTTelnet.c < prev    next >
C/C++ Source or Header  |  1995-05-09  |  6KB  |  233 lines

  1. /*        Telnet Acees, Roligin, etc            HTAccess.c
  2. **        ==========================
  3. **
  4. ** Authors
  5. **    TBL    Tim Berners-Lee timbl@info.cern.ch
  6. **    JFG    Jean-Francois Groff jgh@next.com
  7. **    DD    Denis DeLaRoca (310) 825-4580  <CSP1DWD@mvs.oac.ucla.edu>
  8. ** History
  9. **       8 Jun 92 Telnet hopping prohibited as telnet is not secure (TBL)
  10. **    26 Jun 92 When over DECnet, suppressed FTP, Gopher and News. (JFG)
  11. **     6 Oct 92 Moved HTClientHost and logfile into here. (TBL)
  12. **    17 Dec 92 Tn3270 added, bug fix. (DD)
  13. **     2 Feb 93 Split from HTAccess.c. Registration.(TBL)
  14. */
  15.  
  16. /* Implements:
  17. */
  18. #include "HTTelnet.h"
  19.  
  20. #include "HTParse.h"
  21. #include "HTUtils.h"
  22. #include "HTAnchor.h"
  23. #include "HTTP.h"
  24. #include "HTFile.h"
  25. #include <errno.h>
  26. #include <stdio.h>
  27.  
  28. #include "tcp.h"
  29. #include "HText.h"
  30.  
  31. #include "HTAccess.h"
  32. #include "HTAlert.h"
  33.  
  34. #define HT_NO_DATA -9999
  35.  
  36.  
  37. /*    Telnet or "rlogin" access
  38. **    -------------------------
  39. */
  40. PRIVATE int remote_session ARGS2(char *, access, char *, host)
  41. {
  42.     char * user = host;
  43.     char * hostname = strchr(host, '@');
  44.     char * port = strchr(host, ':');
  45.     char   command[256];
  46.     enum _login_protocol { telnet, rlogin, tn3270 } login_protocol =
  47.         strcmp(access, "rlogin") == 0 ? rlogin :
  48.         strcmp(access, "tn3270") == 0 ? tn3270 : telnet;
  49.     
  50.     if (hostname) {
  51.         *hostname++ = 0;    /* Split */
  52.     } else {
  53.         hostname = host;
  54.         user = 0;        /* No user specified */
  55.     }
  56.     if (port) *port++ = 0;    /* Split */
  57.  
  58.  
  59. /* If the person is already telnetting etc, forbid hopping */
  60. /* This is a security precaution, for us and remote site */
  61.  
  62.     if (HTClientHost) {
  63.  
  64. #ifdef TELNETHOPPER_MAIL
  65.         sprintf(command, 
  66.           "finger @%s | mail -s \"**telnethopper %s\" tbl@dxcern.cern.ch",
  67.            HTClientHost, HTClientHost);
  68.         system(command);
  69. #endif
  70.         printf("\n\nSorry, but the service you have selected is one\n");
  71.         printf("to which you have to log in.  If you were running www\n");
  72.         printf("on your own computer, you would be automatically connected.\n");
  73.         printf("For security reasons, this is not allowed when\n");
  74.         printf("you log in to this information service remotely.\n\n");
  75.  
  76.         printf("You can manually connect to this service using %s\n",
  77.            access);
  78.         printf("to host %s", hostname);
  79.         if (user) printf(", user name %s", user);
  80.         if (port) printf(", port %s", port);
  81.         printf(".\n\n");
  82.         return HT_NO_DATA;
  83.     }
  84.  
  85. /* Not all telnet servers get it even if user name is specified
  86. ** so we always tell the guy what to log in as
  87. */
  88.         if (user) printf("When you are connected, log in as %s\n", user);
  89.     
  90. #ifdef NeXT
  91. #define TELNET_MINUS_L
  92. #endif
  93. #ifdef ultrix
  94. #define TELNET_MINUS_L
  95. #endif
  96.  
  97. #ifdef TELNET_MINUS_L
  98.     sprintf(command, "%s%s%s %s %s", access,
  99.         user ? " -l " : "",
  100.         user ? user : "",
  101.         hostname,
  102.         port ? port : "");
  103.  
  104.     if (TRACE) fprintf(stderr, "HTaccess: Command is: %s\n", command);
  105.     system(command);
  106.     return HT_NO_DATA;        /* Ok - it was done but no data */
  107. #define TELNET_DONE
  108. #endif
  109.  
  110. /* Most unix machines suppport username only with rlogin */
  111. #ifdef unix
  112. #ifndef TELNET_DONE
  113.     if (login_protocol != rlogin) {
  114.         sprintf(command, "%s %s %s", access,
  115.         hostname,
  116.         port ? port : "");
  117.     } else {
  118.         sprintf(command, "%s%s%s %s %s", access,
  119.         user ? " -l " : "",
  120.         user ? user : "",
  121.         hostname,
  122.         port ? port : "");
  123.     }
  124.     if (TRACE) fprintf(stderr, "HTaccess: Command is: %s\n", command);
  125.     system(command);
  126.     return HT_NO_DATA;        /* Ok - it was done but no data */
  127. #define TELNET_DONE
  128. #endif
  129. #endif
  130.  
  131. #ifdef MULTINET                /* VMS varieties */
  132.     if (login_protocol == telnet) {
  133.         sprintf(command, "TELNET %s%s %s",
  134.         port ? "/PORT=" : "",
  135.         port ? port : "",
  136.         hostname);
  137.     } else if (login_protocol == tn3270) {
  138.         sprintf(command, "TN3270 %s%s %s",
  139.         port ? "/PORT=" : "",
  140.         port ? port : "",
  141.         hostname);
  142.     } else {
  143.         sprintf(command, "RLOGIN%s%s%s%s %s", access,
  144.         user ? "/USERNAME=" : "",
  145.         user ? user : "",
  146.         port ? "/PORT=" : "",
  147.         port ? port : "",
  148.         hostname);
  149.     }
  150.     if (TRACE) fprintf(stderr, "HTaccess: Command is: %s\n", command);
  151.     system(command);
  152.     return HT_NO_DATA;        /* Ok - it was done but no data */
  153. #define TELNET_DONE
  154. #endif
  155.  
  156. #ifdef UCX
  157. #define SIMPLE_TELNET
  158. #endif
  159. #ifdef VM
  160. #define SIMPLE_TELNET
  161. #endif
  162. #ifdef SIMPLE_TELNET
  163.     if (login_protocol == telnet) {            /* telnet only */
  164.         sprintf(command, "TELNET  %s",    /* @@ Bug: port ignored */
  165.         hostname);
  166.         if (TRACE) fprintf(stderr, "HTaccess: Command is: %s\n", command);
  167.         system(command);
  168.         return HT_NO_DATA;        /* Ok - it was done but no data */
  169.     }
  170. #endif
  171.  
  172. #ifndef TELNET_DONE
  173.     fprintf(stderr,
  174.     "Sorry, this browser was compiled without the %s access option.\n",
  175.         access);
  176.     fprintf(stderr,
  177.     "\nTo access the information you must %s to %s", access, hostname);
  178.     if (port) fprintf(stderr," (port %s)", port);
  179.     if (user) fprintf(stderr," logging in with username %s", user);
  180.     fprintf(stderr, ".\n");
  181.     return -1;
  182. #endif
  183. }
  184.  
  185. /*    "Load a document" -- establishes a session
  186. **    ------------------------------------------
  187. **
  188. ** On entry,
  189. **    addr        must point to the fully qualified hypertext reference.
  190. **
  191. ** On exit,
  192. **    returns        <0    Error has occured.
  193. **            >=0    Value of file descriptor or socket to be used
  194. **                 to read data.
  195. **    *pFormat    Set to the format of the file, if known.
  196. **            (See WWW.h)
  197. **
  198. */
  199. PRIVATE int HTLoadTelnet
  200. ARGS4
  201. (
  202.  CONST char *,        addr,
  203.  HTParentAnchor *,    anchor,
  204.  HTFormat,        format_out,
  205.  HTStream *,        sink            /* Ignored */
  206. )
  207. {
  208.     char * access;
  209.     
  210.     char * host;
  211.     int status;
  212.     
  213.     if (sink) {
  214.         HTAlert("Can't output a live session -- it has to be interactive");
  215.     return HT_NO_ACCESS;
  216.     }
  217.     access =  HTParse(addr, "file:", PARSE_ACCESS);
  218.     
  219.     host = HTParse(addr, "", PARSE_HOST);
  220.     status = remote_session(access, host);
  221.  
  222.     free(host);    
  223.     free(access);
  224.     return status;
  225. }
  226.  
  227.  
  228. PUBLIC HTProtocol HTTelnet = { "telnet", HTLoadTelnet, NULL };
  229. PUBLIC HTProtocol HTRlogin = { "rlogin", HTLoadTelnet, NULL };
  230. PUBLIC HTProtocol HTTn3270 = { "tn3270", HTLoadTelnet, NULL };
  231.  
  232.  
  233.